/**
 * 
 */
package renmopr.tourguide.util;

import com.alibaba.druid.util.StringUtils;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author huangshiming 日期工具 
 * *TimeStmp 表示这是一个 Timestamp 类型，且有 HHmmss 
 * *Date  表示这是一个 Date 类型，且有 HHmmss 
 * *Stmp 表示这是一个 Timestamp 类型，且 HHmmss 是000000
 * *DtTime 表示这是一个 Date 类型，且 HHmmss 是 000000 
 * *Day 表示这是一个用于计算利息的日期，特征是 HHmmss 是000000，且是 Timestamp 类型
 * 
 */
public class DateUtil {

    private static final String FORMAT_YY_MM_DD_HMS = "yyyy-MM-dd HH:mm:ss";
    private static final String FORMAT_YY_MM_DD= "yyyy-MM-dd";
    private static final String FORMAT_YMDHMS = "yyyyMMddHHmmss";
    private static final String FORMAT_YMD = "yyyyMMdd";

    /**
     * 获得当前时间的 Timesstamp 类型
     * 
     * @return
     */
    public static Timestamp nowTimeStmp() {
        return new Timestamp(new Date().getTime());
    }

    /**
     * 将 Date 转换成 Timestamp
     * 
     * @param date
     * @return
     */
    public static Timestamp toTimeStmp(Date date) {
        return new Timestamp(date.getTime());
    }
    /**
     * 获得某天的下一天 Timestamp 形式
     * 
     * @param date
     * @return
     */
    public static Timestamp nextDayTimeStmp(Date date) {
        return new Timestamp(nextDayDateTime(date).getTime());
    }

    /**
     * 获得某天的下一天
     * 
     * @param date
     * @return
     */
    public static Date nextDayDateTime(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_YEAR, 1);
        return cal.getTime();
    }
    
    /**
     * 将日期格式化为 yyyy-MM-dd 00:00:00
     * 
     * @param date
     * @return
     */
    public static Date fmtDate(Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FORMAT_YY_MM_DD);
        String dateStr = simpleDateFormat.format(date);
        try {
            return simpleDateFormat.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 将 yyyy-MM-dd HH:mm:ss 格式化为 日期 00:00:00
     * 
     * @param date
     * @return
     */
    public static Date fmtDate(String dateStr) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FORMAT_YY_MM_DD);
        try {
            return simpleDateFormat.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 将日期格式化为 yyyy-MM-dd 00:00:00
     * 
     * @param date
     * @return
     */
    public static Timestamp fmtStmp(Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FORMAT_YY_MM_DD);
        String dateStr = simpleDateFormat.format(date);
        try {
            return new Timestamp(simpleDateFormat.parse(dateStr).getTime());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 将 yyyy-MM-dd HH:mm:ss 格式化为 日期 00:00:00
     * 
     * @param date
     * @return
     */
    public static Timestamp fmtStmp(String dateStr) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FORMAT_YY_MM_DD);
        try {
            return new Timestamp(simpleDateFormat.parse(dateStr).getTime());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 将 yyyyMMdd 格式化为 日期 00:00:00
     * 
     * @param date
     * @return
     */
    public static Timestamp fmtStmp_(String dateStr) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FORMAT_YMD);
        try {
            return new Timestamp(simpleDateFormat.parse(dateStr).getTime());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 将 yyyyMMddHHmmss 格式化为 Timestamp
     * 
     * @param date
     * @return
     */
    public static Timestamp fmtTimeStmp(String dateStr) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FORMAT_YMDHMS);
        try {
            return new Timestamp(simpleDateFormat.parse(dateStr).getTime());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 将 yyyy-MM-dd HH:mm:ss 格式化为日期
     * 
     * @param date
     * @return
     */
    public static Date fmtDateTime(String dateStr) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
                FORMAT_YY_MM_DD_HMS);
        try {
            return simpleDateFormat.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 将日期格式化为 yyyy-MM-dd
     * 
     * @param date
     * @return
     */
    public static String fmtYY_MM_DD(Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
                FORMAT_YY_MM_DD);
        return simpleDateFormat.format(date);
    }

    /**
     * 将日期格式化为 yyyy-MM-dd HH:mm:ss
     * 
     * @param date
     * @return
     */
    public static String fmtYY_MM_DD_Hms(Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
                FORMAT_YY_MM_DD_HMS);
        return simpleDateFormat.format(date);
    }
    
    /**
     * 将日期格式化为 yyyyMMddHHmmss
     * @param date
     * @return
     */
    public static String fmtYMdHms(Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
                FORMAT_YMDHMS);
        return simpleDateFormat.format(date);
    }
    
    /**
     * 将日期格式化为 yyyyMMdd
     * @param date
     * @return
     */
    public static String fmtYMd(Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
                FORMAT_YMD);
        return simpleDateFormat.format(date);
    }


    /**
     * 计算两个日期之间的间隔天数
     * 
     * @param from
     * @param to
     * @return
     */
    public static long betweenDays(Date from, Date to) {
        Date df = fmtDate(from);
        Date dt = fmtDate(to);
        long days = (dt.getTime() - df.getTime()) / (1000 * 60 * 60 * 24);
        return days;
    }

    /**
     * 计算两个日期间的间隔月份
     * @param from
     * @param to
     * @return
     */
    public static long betweenMonths(Date from, Date to) {
        return betweenDays(from, to) / 30;
    }

    public static void main(String[] args) {
        Date to = fmtDateTime("2016-01-31 10:25:00");
        Calendar cal = Calendar.getInstance();
        cal.setLenient(false);
        cal.setTime(to);
        cal.add(Calendar.DAY_OF_YEAR, 30);
        System.out.println(cal.getTime());
    }

    /**
     * 转换为时间类型格式
     *
     * @param strDate 日期
     * @return
     */
    public static Date strToDate(String strDate) {
        try {
            String strType = getDateFormat(strDate);
            SimpleDateFormat sf = new SimpleDateFormat(strType);
            return new Date((sf.parse(strDate).getTime()));
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 时间格式(yyyy-MM-dd)
     */
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    /**
     * 时间格式(yyyy-MM-dd HH:mm:ss)
     */
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    /**
     * 无分隔符日期格式 "yyyyMMddHHmmssSSS"
     */
    public static String DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS_SSS = "yyyyMMddHHmmssSSS";
    // 日期转换格式数组
    public static String[][] regularExp = new String[][]{

            // 默认格式
            {"\\d{4}-((([0][1,3-9]|[1][0-2]|[1-9])-([0-2]\\d|[3][0,1]|[1-9]))|((02|2)-(([1-9])|[0-2]\\d)))\\s+([0,1]\\d|[2][0-3]|\\d):([0-5]\\d|\\d):([0-5]\\d|\\d)",
                    DATE_TIME_PATTERN},
            // 仅日期格式 年月日
            {"\\d{4}-((([0][1,3-9]|[1][0-2]|[1-9])-([0-2]\\d|[3][0,1]|[1-9]))|((02|2)-(([1-9])|[0-2]\\d)))",
                    DATE_PATTERN},
            //  带毫秒格式
            {"\\d{4}((([0][1,3-9]|[1][0-2]|[1-9])([0-2]\\d|[3][0,1]|[1-9]))|((02|2)(([1-9])|[0-2]\\d)))([0,1]\\d|[2][0-3])([0-5]\\d|\\d)([0-5]\\d|\\d)\\d{1,3}",
                    DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS_SSS}
    };

    /**
     * 根据传入的日期格式字符串，获取日期的格式
     *
     * @return 秒
     */
    public static String getDateFormat(String date_str) {
        String style = null;
        if (StringUtils.isEmpty(date_str)) {
            return null;
        }
        boolean b = false;
        for (int i = 0; i < regularExp.length; i++) {
            b = date_str.matches(regularExp[i][0]);
            if (b) {
                style = regularExp[i][1];
            }
        }
        return style;
    }
}
